import { defineStore } from "pinia";
import request from '@/utils/request'
import { CartItem } from '@/types/cart'
import { ApiRes, ApiResObj } from "@/types/data";
import useStore from "..";

const useCartStore = defineStore('cart', {
  // 状态
  state: () => ({
    // 购物车列表
    list: [] as CartItem[],
  }),
  persist: {// 开启了数据持久化
    key: 'rabbit-cart-list-94'
  },
  // 计算
  getters: {
    // 商品列表中的商品有isEffective:true表示商品有效 false表示无效商品
    // 商品列表中的商品有stock>0表示有库存 <0没有库存
    // 基于list列表 筛选出 有效商品和库存>0的商品 再去计算数量和总价
    effectiveList(): CartItem[] {
      return this.list.filter(item => item.isEffective && item.stock > 0)
    },
    // 有效商品总数量
    allCounts(): number {
      /*  return this.effectiveList.reduce((sum, item) => {
         return sum + item.count
       }, 0) */
      return this.effectiveList.reduce((sum, item) => sum + item.count, 0)
    },
    // 有效商品总价格
    allPrice(): string {
      const price = this.effectiveList.reduce((sum, item) => sum + item.count * +item.nowPrice, 0)
      return price.toFixed(2)
    },
    //计算全选按钮是否选中
    isAllSelected(): boolean {
      return this.effectiveList.length > 0 && this.effectiveList.every(item => item.selected)
    },
    // 已选商品
    selectedGoods(): CartItem[] {
      return this.effectiveList.filter(item => item.selected)
    },
    // 已选商品数量
    selectedCounts(): number {
      return this.selectedGoods.reduce((sum, item) => sum + item.count, 0)
    },
    // 已选商品总价
    selectedPrice(): string {
      /* const res = this.selectedGoods.reduce((sum, item) => {
         return sum + (+item.nowPrice * item.count)
       }, 0)
       return res.toFixed(2) */
      return this.selectedGoods.reduce((sum, item) => sum + (+item.nowPrice * item.count), 0).toFixed(2)
    },
    // 判断登录状态
    isLogin(): boolean {
      const { user } = useStore()
      // return user.profile.token ? true : false
      // return Boolean(user.profile.token)
      return !!user.profile.token
    }
  },
  // 方法
  actions: {
    // 获取购物车列表
    async getCartList() {
      if (this.isLogin) {
        const res = await request.get<ApiRes<CartItem>>('/member/cart')
        this.list = res.data.result
      } else {
        type ResItem = {
          isEffective: boolean
          nowPrice: string
          stock: number
        }
        // 发送一次请求 获取一下本地存储中购物的商品的最新的数据信息
        // 这个接口做的不好 正常是只需要发一次请求即可
        this.list.forEach(async item => {
          // console.log(item.skuId);
          const res = await request.get<ApiResObj<ResItem>>(`/goods/stock/${item.skuId}`)
          const result = res.data.result
          item.isEffective = result.isEffective
          item.nowPrice = result.nowPrice
          item.stock = result.stock
        })

      }
    },
    // 添加购物车
    async addCart(data: CartItem) {
      if (this.isLogin) {
        await request.post('/member/cart', { skuId: data.skuId, count: data.count })
        // 重新获取一次购物车列表即可
        this.getCartList()
      } else {
        // console.log('本地操作', data)
        // 先检查数组中是否有重复的skuId的商品,有的话更新数量, 没有查找到再向数组中新增
        const goods = this.list.find(item => item.skuId === data.skuId)
        if (goods) {
          goods.count += data.count
        } else {
          this.list.unshift(data)
        }
      }
    },
    // 删除商品 restful接口模式
    // 删除一个商品 ['12121']  ['2121','4444']
    async delCart(ids: string[]) {
      // params 查询参数 会将参数 地址后 ?参数
      // delete请求也可传请求体 data  
      if (this.isLogin) {
        await request.delete('/member/cart', { data: { ids } })
        // 重新获取一次购物车列表即可
        this.getCartList()
      } else {
        // this.list = this.list.filter(item => item.skuId !== ids[0])  不够完美
        // 后期满足 删除已选中
        this.list = this.list.filter(item => !ids.includes(item.skuId))
      }
    },
    // 修改购物车(商品的状态和数量)
    async updateCart(skuId: string, data: { selected?: boolean; count?: number }) {
      if (this.isLogin) {
        await request.put(`/member/cart/${skuId}`, data)
        // 重新获取一次购物车列表即可
        this.getCartList()
      } else {
        // console.log('本地的梳理修改和状态修改')
        const goods = this.effectiveList.find(item => item.skuId === skuId)
        // 如果修改状态为false  永远不会进这个分支的,  只要是未登录更新选中状态让分支永远执行
        if (data.selected !== undefined) {
          goods!.selected = data.selected
        }
        if (data.count !== undefined) {
          goods!.count = data.count
        }

      }
    },
    // 全选和反选
    async changeAllSelected(selected: boolean) {
      if (this.isLogin) {
        await request.put('/member/cart/selected', { selected })
        // 重新获取一次购物车列表即可
        this.getCartList()
      } else {
        this.list.forEach(item => item.selected = selected)
      }
    },
    // 退出清空购物车
    // 被async修饰过的函数即便没有返回值也是有返回值 是一个promise
    // 在vuex中 actions中写的函数不管有没有加async 返回值都是promise
    clearCart() {
      this.list = []
    },
    // 登录后合并购物车  本地的购物车列表 要在登录后 同步到用户的购物车列表
    async mergeCart() {
      const newArr = this.list.map(item => {
        return {
          skuId: item.skuId,
          selected: item.selected,
          count: item.count
        }
      })
      await request.post('/member/cart/merge', newArr)
    }
  }
})

export default useCartStore